package airplane.war;

import airplane.obj.*;
import airplane.utils.GameUtils;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.util.Random;
/**
 * x 往右边是正数
 * y 往下是正数
 */
public class GameWin extends JFrame {
    // 游戏状态 0 未开始 1游戏中 2暂停 3通过失败 4通过成功
    public static int state = 0;

    public int repaint = 0;
    int width = 600;
    int height = 600;
    Random random = new Random();
    // 缓存默认图片
    Image defaultImg = null;
    // 背景对象
    public BgObj bgObj = new BgObj(GameUtils.bgImg, 0, -2000, 2);
    // 我方飞机的对象
    public PlaneObj planeObj = new PlaneObj(GameUtils.planeImg, 290, 550, 22, 33, 0, this);
    // 绘制次数
    int count = 1;
    // 清空数据
    int clear = 0;
    // boos
    public BoosObj boosObj = null;

    // 分数
    public static int score = 0;

    public void prepare() throws IOException {
        // 设置窗口可见
        this.setVisible(true);
        // 设置窗口的大小
        this.setSize(width,height);
        // 设置窗口位置 居中
        this.setLocationRelativeTo(null);
        // 设置窗口的标题
        this.setTitle("刘一手飞机大战");

        // 所有要绘制的都添加到gameList中
        // 背景
        GameUtils.gameObjList.add(bgObj);
        // 我方飞机
        GameUtils.gameObjList.add(planeObj);

        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // 代表点击鼠标了
                if (e.getButton() == 1 && state == 0){
                    // 游戏开始
                    state = 1;
                }
                // 游戏暂停的时候点击就是重新开始
                if (e.getButton() == 1 && state == 3){

                    // 游戏未开始
                    state = 0;
                    count = 0;
                    clear = 1;
                    repaint();
                }
            }
        });

        while (true) {
            // 1s会调用30次
            if (state == 1) {
                // 创建对象
                createObj();
                // 重新绘制画面
                repaint();
            }

            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 每次调用repaint()就会执行这里
     * @param g
     */
    @Override
    public void paint(Graphics g) {
        // 初始化对象
        if (defaultImg == null) {
            defaultImg = createImage(width, height);
        }
        // 获取绘制的默认图片
        Graphics gImg = defaultImg.getGraphics();
        // 设置大小
        gImg.fillRect(0, 0, width, height);
        // boos
        if (boosObj == null && score == 10) {
            boosObj = new BoosObj(GameUtils.boosImg, 290, 50, 100, 70, 3, this);
            GameUtils.gameObjList.add(boosObj);
        }

        // 游戏未开始的时候添加背景图片
        if (state == 0) {
            // 清空之前的数据
            if (clear == 1) {
                for (EnemyObj enemyObj : GameUtils.explodeObjList) {
                    enemyObj.setX(-200);
                    enemyObj.setY(200);
                }
                for (ShellObj shellObj : GameUtils.shellObjList) {
                    shellObj.setX(-300);
                    shellObj.setY(-300);
                }
                for (EnemyObj enemyObj : GameUtils.enemyObjList) {
                    enemyObj.setX(-100);
                    enemyObj.setY(100);
                }
                GameUtils.explodeObjList.remove(GameUtils.explodeObjList);
                GameUtils.shellObjList.remove(GameUtils.shellObjList);
                GameUtils.enemyObjList.remove(GameUtils.enemyObjList);
            }

            gImg.drawImage(GameUtils.bgImg, 0, 0, null);
            gImg.drawImage(GameUtils.boosImg, 250, 150, null);
            gImg.drawImage(GameUtils.explodeImg, 270, 250, null);
            GameUtils.drawWord(gImg,"点击游戏开始",Color.yellow,40,180,400);
        } else if (state == 1) { // 游戏开始的时候
            // 绘制所有图像
            for (int i = 0; i < GameUtils.gameObjList.size(); i++) {
                GameUtils.gameObjList.get(i).paintSelf(gImg);
            }
            // 删除所有要删除的物体对象
            GameUtils.removeObjList.removeAll(GameUtils.removeObjList);
        } else if (state == 3) {
            // 绘制所有图像
            for (int i = 0; i < GameUtils.gameObjList.size(); i++) {
                GameUtils.gameObjList.get(i).paintSelf(gImg);
            }
            gImg.drawImage(GameUtils.explodeImg, planeObj.getX() - 15 , planeObj.getY() - 15 , null);
            GameUtils.drawWord(gImg,"GAME OVER",Color.red,40,180,360);
        } else if (state == 4) {
            // 绘制所有图像
            for (int i = 0; i < GameUtils.gameObjList.size(); i++) {
                GameUtils.gameObjList.get(i).paintSelf(gImg);
            }
            gImg.drawImage(GameUtils.explodeImg, boosObj.getX() - 15, boosObj.getY() - 15, null);
            GameUtils.drawWord(gImg, "游戏通关", Color.red, 40, 230, 360);
        }
        // boos 提醒
        if (score > 7 && score < 10) {
            GameUtils.drawWord(gImg,"BOOS COME",Color.ORANGE,30,180,200);
        }

        // 积分面板
        GameUtils.drawWord(gImg,score + " 分",Color.pink,18,15,60);


        // 把绘制的图片一次性绘画出来
        g.drawImage(defaultImg, 0, 0, null);
        count++;
        if ((state == 0 || state == 3 || state == 4) && repaint < 2) {
            repaint();
            repaint++;
        }

    }

    /**
     * 创建对象
     */
    void createObj()
    {
        // 我方子弹
        if (count % 8 == 0) {
            GameUtils.shellObjList.add(new ShellObj(GameUtils.shellImg, planeObj.getX() + 3, planeObj.getY() - 20, 12, 12, 8, this));
            GameUtils.gameObjList.add(GameUtils.shellObjList.get(GameUtils.shellObjList.size() - 1));
        }
        // 敌方飞机
        if (count % 12 == 0){
            GameUtils.enemyObjList.add(new EnemyObj(GameUtils.enemyImg, random.nextInt(width - 35) + 10, 25, 30, 18, 3, this));
            GameUtils.gameObjList.add(GameUtils.enemyObjList.get(GameUtils.enemyObjList.size() - 1));
        }
        // 敌方弹
        if (boosObj != null && count % 20 == 0) {
            GameUtils.boosShellObjList.add(new BoosShellObj(GameUtils.boosShellImg, boosObj.getX() + 3, boosObj.getY() + 20, 12, 12, 8, this));
            GameUtils.gameObjList.add(GameUtils.boosShellObjList.get(GameUtils.boosShellObjList.size() - 1));
        }
    }
    /**
     * 主方法
     * @param args
     */
    public static void main(String[] args) throws IOException {
        GameWin gameWin = new GameWin();
        File directory = new File("");// 参数为空
        GameUtils.able = directory.getCanonicalPath() + "/";
        System.out.println("项目路径：" + GameUtils.able); // 设置项目路径，把图片放在该目录下的 imgs 就可以

        gameWin.prepare();
    }

}
